/*
 * configuration.c
 *
 *  Created on: 3 nov. 2012
 *      Author: Rania ToumiGasri
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include "configuration.h"

/**
 * configurer le programme selon les arguments d'entrées
 */
void initialiserConfiguration(int argc, char** argv) {
	//configurer le nom du fichier d'entrer
	setFileName(argc, argv);
	//configurer le seed
	setSeed(argc, argv);
	// configuter le nombre de centres mobiles
	setCentreNumber(argc, argv);
	//configurer le nombre maximal diteration
	setMaxIteration(argc,argv);
	//choisir la distance à utiliser
	//setDistanceMetric(argc,argv);
	// configuter les options de log
	setOutputFile(argc, argv);
}
void showUsage(char **argv){
	printf("Usage: %s [-options] \n",argv[0] );
	printf("où options contient:\n");
	printf("\t-file\t nom du fichier d'entrée contenant les données.\n");
	printf("\t-seed\t le seed utilisé pour la fonction random (surtout pour la phase d'initialisation).\n");
	printf("\t-k\t le nombre de centres (i.e nombre de classes) attendus. Par défaut 2.\n");
	printf("\t-mi\t le nombre maximal d'iteration avant d'arrêter l'algorithme. Par défaut 1000.\n");
	printf("\t-output fichier de sortie qui remplacera la sortie standart\n");
}

void setSeed(int argc, char** argv) {
	config.seed = time(0);
	int i;
	for (i = 1; i < argc - 1; i++) {
		if (strncmp(argv[i], "-seed", 5) == 0) {
			config.seed = atoi(argv[i + 1]);
			break;
		}
	}
	// initialiser le rand
	srand(config.seed);
	printf("seed = %d\n", config.seed);
}
void setFileName(int argc, char** argv) {
	int i;
	for (i = 1; i < argc - 1; i++) {
		if (strncmp(argv[i], "-file", 5) == 0) {
			config.fileName = (argv[i + 1]);
			break;
		}
	}
	if(config.fileName ==NULL){
		showUsage(argv);
		exit(-1);
	}
	printf("fichier d'entée = '%s'\n", config.fileName);
}
void setCentreNumber(int argc, char** argv) {
	config.centerNumber = 2;
	int i;
	for (i = 1; i < argc - 1; i++) {
		if (strncmp(argv[i], "-k", 2) == 0) {
			config.centerNumber = atoi(argv[i + 1]);
			break;
		}
	}
	printf("nombre de centre = '%d'\n", config.centerNumber);
}
void setMaxIteration(int argc, char** argv) {
	config.maxIteration = 1000;
	int i;
	for (i = 1; i < argc - 1; i++) {
		if (strncmp(argv[i], "-mi", 3) == 0) {
			config.maxIteration = atoi(argv[i + 1]);
			break;
		}
	}
	printf("nombre maximal d'iterations = '%d'\n", config.maxIteration);
}
void setDistanceMetric(int argc, char** argv) {
	int i;
	errno = 0;
	for (i = 1; i < argc - 1; i++) {
		if (strncmp(argv[i], "-dm", 3) == 0) {
			FILE* file = freopen(argv[i + 1], "w",stdout);;
			if (file == NULL && errno != 0) {
				printf(
						"impossible douvrir le fichier '%s', %s. les logs seront rediriger vers la sortie standard\n",
						argv[i + 1], strerror(errno));
			} else {
				printf("le fichier de log sera '%s'\n", argv[i + 1]);
				config.logFile = file;

			}
			break;
		}
	}
}

void setOutputFile(int argc, char** argv) {
	int i;
	errno = 0;
	for (i = 1; i < argc - 1; i++) {
		if (strncmp(argv[i], "-output", 7) == 0) {
			FILE* file = freopen(argv[i + 1], "w",stdout);;
			if (file == NULL && errno != 0) {
				printf(
						"impossible douvrir le fichier '%s', %s. les logs seront rediriger vers la sortie standard\n",
						argv[i + 1], strerror(errno));
			} else {
				printf("le fichier de log sera '%s'\n", argv[i + 1]);
				config.logFile = file;

			}
			break;
		}
	}
}
